package com.xinyi.reactivemvvm.model;

/**
 * @author 杨耿雷
 * @date 2024/9/23 22:11
 * @description 资源模型：表示资源状态的抽象类，用于处理数据加载的不同状态。
 * @param <T> 泛型类型，表示成功时所包含的数据类型。
 */
public abstract class Resource<T> {

    /**
     * 表示资源正在加载状态。
     * 这是一个单例类，代表资源正在加载的状态。
     */
    public static final class Loading<T> extends Resource<T> {

        /**
         * 单例实例，确保加载状态只有一个。
         */
        public static final Loading<Void> INSTANCE = new Loading<>();
    }

    /**
     * 表示资源加载成功的状态，封装了成功的数据信息。
     * 
     * @param <T> 泛型类型，表示成功时的具体数据类型。
     */
    public static final class Success<T> extends Resource<T> {

        /**
         * 加载成功时包含的具体数据。
         */
        private final T value;

        /**
         * 构造函数，用于初始化成功状态下的数据。
         * 
         * @param value 成功加载的具体数据。
         */
        public Success(T value) {
            this.value = value;
        }

        /**
         * 获取成功加载的数据。
         * 
         * @return 加载成功的数据。
         */
        public T getValue() {
            return value;
        }
    }

    /**
     * 表示资源加载失败的状态，封装了失败时的异常信息。
     */
    public static final class Fail<T> extends Resource<T> {

        /**
         * 加载失败时的异常信息。
         */
        private final Throwable exception;

        /**
         * 构造函数，用于初始化失败状态下的异常信息。
         * 
         * @param exception 加载失败时的异常。
         */
        public Fail(Throwable exception) {
            this.exception = exception;
        }

        /**
         * 获取加载失败的异常信息。
         * 
         * @return 加载失败的异常信息。
         */
        public Throwable getException() {
            return exception;
        }
    }
}
